package br.com.velp.sudecap.serviceimpl;

import br.com.velp.sudecap.dao.DireitoUsuarioDAO;
import br.com.velp.sudecap.entidade.DireitoSistema;
import br.com.velp.sudecap.entidade.DireitoUsuario;
import br.com.velp.sudecap.entidade.GrupoUsuario;
import br.com.velp.sudecap.entidade.Usuario;
import br.com.velp.sudecap.service.DireitoUsuarioService;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * <sumario>
 * <objetivo> "Rastreabilidade" </objetivo>
 * <autor> EDUARDO SANTOS DE OLIVEIRA </autor>
 * <versao>1.0.0.0</versao>
 * <data_criacao> 17.10.2012 </data_criacao>
 * <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <requisitos_afetados> RF010.03 – Gerenciar Permissão de Usuários / RF010.04 - Gerenciar de Grupo de Usuários </requisitos_afetados>
 * <descricao> Classe Responsável Pela Aplicação de Regras de Negócio
 *             no Contexto de Direitos de Usuários</descricao>
 * </sumario>
 */
@Service("direitoUsuarioService")
@Transactional(readOnly = true)
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class DireitoUsuarioServiceImpl implements DireitoUsuarioService{
    
    public static final Long serialVersionUID = 1L;
    
    @Autowired
    private DireitoUsuarioDAO direitoUsuarioDAO;

    @Transactional(readOnly = false)
    @Override
    public Long salvarDireitoUsuario(DireitoUsuario direitoUsuario){
	return this.direitoUsuarioDAO.salvar(direitoUsuario);
    }
    
    @Transactional(readOnly = false)
    @Override
    public void atualizarDireitoUsuario(DireitoUsuario direitoUsuario){
	this.direitoUsuarioDAO.atualizar(direitoUsuario);
    }
    
    @Transactional(readOnly = false)
    @Override
    public void excluirDireitoUsuario(DireitoUsuario direitoUsuario){
	this.direitoUsuarioDAO.excluir(direitoUsuario);
    }
    
    @Override
    public DireitoUsuario obterDireitoUsuarioPorId(Long idDireitoUsuario){
	return this.direitoUsuarioDAO.obterPorId(idDireitoUsuario);
    }
    
    @Override
    public List<DireitoUsuario> recuperarDireitosUsuario(Usuario usuario){
	return this.direitoUsuarioDAO.recuperarDireitosUsuario(usuario);
    }
    
    @Override
    public List<GrupoUsuario> recuperarTodosGrupos(){
	return this.direitoUsuarioDAO.recuperarTodosGrupos();
    }
    
    @Override
    public List<DireitoSistema> recuperarTodosDireitosSistema(){
	return this.direitoUsuarioDAO.recuperarTodosDireitosSistema();
    }
    
    @Override
    public List<Usuario> recuperarTodosUsuarios(){
	return this.direitoUsuarioDAO.recuperarTodosUsuarios();
    }

    @Override
    public void salvarAtualizarDireitosUsuario(List<DireitoSistema> direitosSistema, 
	List<DireitoSistema> direitosSistemaSelecionados, List<GrupoUsuario> gruposUsuario, 
	List<GrupoUsuario> gruposUsuarioSelecionados, Usuario usuario) {
	
	for(DireitoSistema direito : direitosSistema){
	    this.direitoUsuarioDAO.removerDireitoUsuario(usuario, direito);
	}
	
	for(GrupoUsuario grupo : gruposUsuario){
	    this.direitoUsuarioDAO.removerDireitoUsuario(usuario, grupo);
	}
	
	for(DireitoSistema direito : direitosSistemaSelecionados){
	    DireitoUsuario direitoUsuario = new DireitoUsuario();
	    direitoUsuario.setUsuario(usuario);
	    direitoUsuario.setDireito(direito);
	    if(!this.direitoUsuarioDAO.usuarioContemDireito(usuario, direito)){
		this.direitoUsuarioDAO.salvar(direitoUsuario);
	    }
	}
	
	for(GrupoUsuario grupo : gruposUsuarioSelecionados){
	    DireitoUsuario direitoUsuario = new DireitoUsuario();
	    direitoUsuario.setUsuario(usuario);
	    direitoUsuario.setGrupo(grupo);
	    if(!this.direitoUsuarioDAO.usuarioContemGrupo(usuario, grupo)){
		this.direitoUsuarioDAO.salvar(direitoUsuario);
	    }
	}
	
    }
    
}
